package com.example.demo.剑指offer;

/**
 * @author：zzc
 * @date: 2022/8/18
 */
public class 矩阵中的路径 {

    //给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中，返回 true ；否则，返回 false 。
    //
    //单词必须按照字母顺序，通过相邻的单元格内的字母构成，其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
    //
    //
    //
    //例如，在下面的 3×4 的矩阵中包含单词 "ABCCED"（单词中的字母已标出）。
    //
    //
    //
    //
    //
    //示例 1：
    //
    //输入：board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
    //输出：true
    //示例 2：
    //
    //输入：board = [["a","b"],["c","d"]], word = "abcd"
    //输出：false

    class Solution {
        private char[][] board;
        private String word;
        private int m;
        private int n;

        public boolean exist(char[][] board, String word) {
            m = board.length;
            n = board[0].length;
            this.board = board;
            this.word = word;
            for (int i = 0; i < m; ++i) {
                for (int j = 0; j < n; ++j) {
                    if (dfs(i, j, 0)) {
                        return true;
                    }
                }
            }
            return false;
        }

        private boolean dfs(int i, int j, int k) {
            if (k == word.length()) {
                return true;
            }
            if (i < 0 || i >= m || j < 0 || j >= n || word.charAt(k) != board[i][j]) {
                return false;
            }
            board[i][j] = ' ';
            int[] dirs = {-1, 0, 1, 0, -1};
            boolean ans = false;
            for (int l = 0; l < 4; ++l) {
                ans = ans || dfs(i + dirs[l], j + dirs[l + 1], k + 1);
            }
            board[i][j] = word.charAt(k);
            return ans;
        }
    }

}
